package top.glkj.hms.service;

import top.glkj.hms.entity.Room;
import top.glkj.hms.entity.RoomType;
import top.glkj.hms.entity.User;
import top.glkj.hms.entity.UserDetail;
import top.glkj.hms.exception.DefineException;
import top.glkj.hms.utils.Result;
import top.glkj.hms.utils.Status;

import java.util.List;
import java.util.Map;

/**
 * @author : xgl
 * @version : 0.0.1
 * @date :2020/12/7 23:36
 */
public interface RoomService extends BaseService<Room> {
    /**
     * 添加房屋
     * @param room 房屋
     * @return 结果
     */
    public Result addRoom(Room room);

    /**
     * 更新房屋
     * @param room 更新值
     * @return 更新房屋
     */
    public Result updateRoom(Room room);

    /**
     * 分页获取房屋
     * @param page 当前页
     * @param size 当前页
     * @return 分页获取房屋
     */
    public Result getRoomByPageAndSize(int page,int size);

    /**
     *  分页和查询获取房屋
     * @param page 当前页
     * @param size 分页大小
     * @param searchValue 查询键值对
     * @return 分页和查询获取房屋
     */
    public Result getRoomByPageAndSizeAndSearch(int page, int size, Map<String,String> searchValue);

    /**
     * 批量添加房屋
     * @param roomList 房屋数据
     * @return 添加结果
     * @throws DefineException E
     */
    public Result addAllRoom(List<Room> roomList) throws DefineException;

    /**
     * 获取房屋根据房屋状态
     * @param status 房屋状态
     * @return 房屋
     */
    public Result getRoomByStatus(Status status);

    /**
     * 获取房间根据房屋收费
     * @param minValue 最小金额
     * @param maxValue 最大金额
     * @return 房间
     */
    public Result getRoomByPrice(double minValue,double maxValue);

    /**
     * 获取房间根据房间类型
     * @param roomType 房间类型
     * @return 房间
     */
    public Result getRoomByType(RoomType roomType);

    /**
     * 添加房间类型
     * @param roomType 房间类型
     * @return 添加结果
     */
    public Result addRoomType(RoomType roomType);

    /**
     * 删除房间类型
     * @param id 编号
     * @return 删除结果
     */
    public Result deleteRoomType(long id);

    /**
     * 移除房间类型
     * @param id 房间类型
     * @return 移除结果
     */
    public Result removeRoomType(Long id);

    /**
     * 更新房间类型
     * @param roomType 房间类型
     * @return 更新结果
     */
    public Result updateRoomType(RoomType roomType);


    /**
     * 分页获取房屋类型
     * @param page 当前页
     * @param size 当前页
     * @return 分页获取房屋
     */
    public Result getRoomTypeByPageAndSize(int page,int size);

    /**
     *  分页和查询获取房屋类型
     * @param page 当前页
     * @param size 分页大小
     * @param searchValue 查询键值对
     * @return 分页和查询获取房屋
     */
    public Result getRoomTypeByPageAndSizeAndSearch(int page, int size, Map<String,String> searchValue);

    /**
     *
     * @return 查询获取房屋
     */
    public Result getRoomType();

    /**
     * 客人入住
     * @param room 入住房间
     * @param user 入住用户
     * @return  Result
     */
    public Result intoRoom(Room room, UserDetail user);

    /**
     * 客人入住
     * @param room 入住房间
     * @param user 入住用户
     * @return Result
     */
    public Result intoBigRoom(Room room, List<UserDetail> user);

    /**
     * 客人入住
     * @param user 入住用户
     * @return Result
     */
    public Result firstIntoBigRoom(List<UserDetail> user);

    /**
     * 客人入住
     * @param user 入住用户
     * @return Result
     */
    public Result firstIntoRoom(UserDetail user);

    /**
     * 根据最近时间获取客房
     * @return room
     */
    public Result getRoomByCreateTime();

    /**
     * 根据评估获取房间
     * @return room
     */
    public Result getRoomByScore();

    /**
     * 根据房间类型获取房间
     * @return room
     */
    public Result getRoomByType();

    /**
     * 根据用户信息检索房间
     * @param user 用户信息
     * @return 房间列表
     */
    public Result getAllRoomByCheckUser(User user);


    public Result getAllRoomByUserLike(User user);
}
